<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			// ES6 新增了let命令，用来声明变量
			// 它的用法类似于var，但是所声明的变量，只在let命令所在的代码块内有效
			{
				let a = 10;
				var b = 1;
			}
			// a - ReferenceError: a is not defined.
			// b - 1

			// var命令会发生“变量提升”现象，即变量可以在声明之前使用，值为undefined
			// 这种现象多多少少是有些奇怪的，按照一般的逻辑，变量应该在声明语句之后才可以使用
			// var 的情况
			console.log(foo); // 输出undefined
			var foo = 2;
			// let 的情况
			console.log(bar); // 报错ReferenceError
			let bar = 2;

			// 暂时性死区（temporal dead zone，简称 TDZ）
			var tmp = 123;
			if (true) {
				// TDZ开始
				tmp = 'abc'; // ReferenceError
				console.log(tmp); // ReferenceError

				// TDZ结束
				let tmp;
				console.log(tmp); // undefined
				tmp = 123;
				console.log(tmp); // 123
			}

			// let不允许在相同作用域内，重复声明同一个变量
			// 报错
			function func() {
				let a = 10;
				var a = 1;
			}


			// const声明一个只读的常量。一旦声明，常量的值就不能改变
			const PI = 3.1415; // 3.1415
			PI = 3; // TypeError: Assignment to constant variable.
		</script>
	</body>
</html>
